const fs = require('fs').promises;
const path = require('path');
const express = require('express');

/**
 * 处理多页签详情模板
 * @param {Object} data - 前端传来的数据
 * @param {Object} templateConfig - 模板配置
 * @param {string} targetDir - 目标目录
 * @param {string} hooksDir - hooks目录
 * @param {Object} res - Express响应对象
 */
async function processMultiTabDetailTemplate(data, templateConfig, targetDir, hooksDir, res) {

  const { pageCode, dataSourceConfig = [] } = data;
  // 为每个 tab 生成对应的代码
  for (const tabConfig of dataSourceConfig) {
    const { key, dataSourceType, dataSource } = tabConfig;
    const tabDir = path.join(targetDir, key);
    
    // 创建 tab 目录
    await fs.mkdir(tabDir, { recursive: true });
    
    // 根据 dataSourceType 生成对应的代码
    if (dataSourceType === 'detail') {
      await generateDetailCode(tabConfig, tabDir, pageCode, res);
    } else if (dataSourceType === 'list') {
      await generateListCode(tabConfig, tabDir, pageCode, res);
    }
  }
  
  // 处理Vue文件
  // const vueSourcePath = path.join(__dirname, '../../codeTemplate/multiTabDetail/detail.ejs');
  const vueDestPath = path.join(targetDir, 'detail.vue');
  const vueContent = await new Promise((resolve, reject) => {
    res.render('multiTabDetail/detail.ejs', {
      dataSourceConfig,
      tabs: dataSourceConfig.map(tab => ({
        key: tab.key,
        title: tab.title,
        dataSourceType: tab.dataSourceType
      }))
    }, (err, html) => {
      if (err) {
        console.error('Error rendering detail.ejs:', err);
        reject(err);
      } else {
        resolve(html);
      }
    });
  });
  
  // // 读取Vue模板文件
  // let vueContent = await fs.readFile(vueSourcePath, 'utf-8');
  
  // // 替换pageCode
  // vueContent = vueContent.replace(/<%= pageCode %>/g, pageCode || '');
  
  // 写入处理后的Vue文件
  await fs.writeFile(vueDestPath, vueContent);
  
  // 复制less文件
  const lessSourcePath = path.join(__dirname, '../../codeTemplate/multiTabDetail/detail.less');
  const lessDestPath = path.join(targetDir, 'detail.less');
  await fs.copyFile(lessSourcePath, lessDestPath);
  
  // 复制util.ts文件
  const utilSourcePath = path.join(__dirname, '../../codeTemplate/multiTabDetail/util.ts');
  const utilDestPath = path.join(targetDir, 'util.ts');
  if (await fileExists(utilSourcePath)) {
    await fs.copyFile(utilSourcePath, utilDestPath);
  }

          // 根据标签页数据生成相应的内容
          // if (dataSourceConfig.length > 0) {
          //   // 查找第一个详情类型的数据源（用于头部表单）
          //   const headerTab = dataSourceConfig.find(tab => tab.dataSourceType === 'detail');
          //   if (headerTab && file === 'useForms.ejs') {
          //     // 处理表单字段
          //     content = replaceFormFields(content, headerTab.dataSource.headerFields);
          //   }
            
          //   // 查找列表类型的数据源（用于表格）
          //   const listTabs = dataSourceConfig.filter(tab => tab.dataSourceType === 'list');
          //   if (listTabs.length > 0 && file === 'useTables.tsx') {
          //     // 处理表格字段，这里我们只处理第一个列表
          //     content = replaceTableFields(content, listTabs[0].dataSource.listFields);
          //   }
          // }
  
  // 处理hooks目录中的文件
  // const templateHooksDir = path.join(__dirname, '../../codeTemplate/multiTabDetail/hooks');
  // const hookFiles = await fs.readdir(templateHooksDir);
  
  // for (const file of hookFiles) {
  //   const sourcePath = path.join(templateHooksDir, file);
  //   const destPath = path.join(hooksDir, file);
  //   const stat = await fs.stat(sourcePath);
    
  //   // if (stat.isFile()) {
  //   //   if (file.endsWith('.ejs')) {
  //   //     // 处理.ejs模板文件
  //   //     let content = await fs.readFile(sourcePath, 'utf-8');
        
  //   //     // // 根据标签页数据生成相应的内容
  //   //     // if (dataSourceConfig.length > 0) {
  //   //     //   // 查找第一个详情类型的数据源（用于头部表单）
  //   //     //   const headerTab = dataSourceConfig.find(tab => tab.dataSourceType === 'detail');
  //   //     //   if (headerTab && file === 'useForms.ejs') {
  //   //     //     // 处理表单字段
  //   //     //     content = replaceFormFields(content, headerTab.dataSource.headerFields);
  //   //     //   }
          
  //   //     //   // 查找列表类型的数据源（用于表格）
  //   //     //   const listTabs = dataSourceConfig.filter(tab => tab.dataSourceType === 'list');
  //   //     //   if (listTabs.length > 0 && file === 'useTables.tsx') {
  //   //     //     // 处理表格字段，这里我们只处理第一个列表
  //   //     //     content = replaceTableFields(content, listTabs[0].dataSource.listFields);
  //   //     //   }
  //   //     // }
        
  //   //     // 替换pageCode
  //   //     content = content.replace(/<%= pageCode %>/g, pageCode || '');
        
  //   //     // 将.ejs文件保存为.ts文件
  //   //     const destTsPath = destPath.replace(/\.ejs$/, '.ts');
  //   //     await fs.writeFile(destTsPath, content);
  //   //   } else {
  //   //     // 直接复制非ejs文件
  //   //     await fs.copyFile(sourcePath, destPath);
  //   //   }
  //   // }
  // }
}

/**
 * 替换表单字段
 */
function replaceFormFields(content, fields) {
  // 这里可以根据实际需求添加更复杂的字段替换逻辑
  // 目前只是简单地返回内容
  return content;
}

/**
 * 替换表格字段
 */
function replaceTableFields(content, fields) {
  // 这里可以根据实际需求添加更复杂的字段替换逻辑
  // 目前只是简单地返回内容
  return content;
}

/**
 * 检查文件是否存在
 */
async function fileExists(filePath) {
  try {
    await fs.access(filePath);
    return true;
  } catch {
    return false;
  }
}

/**
 * 生成详情页代码
 */
async function generateDetailCode(tabConfig, targetDir, pageCode, res) {
  const { key, dataSource } = tabConfig;
  const templateDir = path.join(__dirname, '../../codeTemplate/detail');
  
  // 使用 Express 的 render 方法处理 detail.ejs 模板
  const detailVueContent = await new Promise((resolve, reject) => {
    res.render('detail/detail.ejs', {
      pageCode: pageCode || '',
      dataSource: dataSource
    }, (err, html) => {
      if (err) {
        console.error('Error rendering detail/detail.ejs:', err);
        reject(err);
      } else {
        resolve(html);
      }
    });
  });
  
  // 写入 detail.vue 文件
  const detailVuePath = path.join(targetDir, 'detail.vue');
  await fs.writeFile(detailVuePath, detailVueContent);
  
  // 复制 detail.less 文件
  const lessSourcePath = path.join(templateDir, 'detail.less');
  const lessDestPath = path.join(targetDir, 'detail.less');
  await fs.copyFile(lessSourcePath, lessDestPath);
  
  // 复制 util.ts 文件
  const utilSourcePath = path.join(templateDir, 'util.ts');
  const utilDestPath = path.join(targetDir, 'util.ts');
  if (await fileExists(utilSourcePath)) {
    await fs.copyFile(utilSourcePath, utilDestPath);
  }
  
  // 处理 hooks 目录
  const hooksSourceDir = path.join(templateDir, 'hooks');
  const hooksDestDir = path.join(targetDir, 'hooks');
  await fs.mkdir(hooksDestDir, { recursive: true });
  
  if (await fileExists(hooksSourceDir)) {
    const hookFiles = await fs.readdir(hooksSourceDir);
    for (const file of hookFiles) {
      const sourcePath = path.join(hooksSourceDir, file);
      const destPath = path.join(hooksDestDir, file);
      const stat = await fs.stat(sourcePath);
      
      if (stat.isFile()) {
        // 处理 .ejs 文件
        if (file.endsWith('.ejs')) {
          // 根据不同的 hooks 文件传递不同的数据
          let renderData = {
            pageCode: pageCode || ''
          };
          
          // 对于 useForms.ejs，传递 headerFields 和 detailFormFields
          if (file === 'useForms.ejs' && dataSource) {
            renderData.headerFields = dataSource.headerFields || [];
            renderData.detailFormFields = dataSource.detailFormFields || dataSource.headerFields || [];
          }
          
          // 对于 useTables.ejs，传递 listFields
          if (file === 'useTables.ejs' && dataSource) {
            renderData.listFields = dataSource.listFields || [];
          }
          
          let content = await new Promise((resolve, reject) => {
            res.render(`detail/hooks/${file}`, renderData, (err, html) => {
              if (err) {
                console.error(`Error rendering detail/hooks/${file}:`, err);
                reject(err);
              } else {
                resolve(html);
              }
            });
          });
          
          // 将 .ejs 文件保存为 .ts 文件
          const destTsPath = destPath.replace(/\.ejs$/, '.tsx');
          await fs.writeFile(destTsPath, content);
        } else {
          // 直接复制非 ejs 文件
          await fs.copyFile(sourcePath, destPath);
        }
      }
    }
  }
}

/**
 * 生成列表页代码
 */
async function generateListCode(tabConfig, targetDir, pageCode, res) {
  const { key, dataSource } = tabConfig;
  const templateDir = path.join(__dirname, '../../codeTemplate/commonList');
  
  // 使用 Express 的 render 方法处理 list.ejs 模板
  const listVueContent = await new Promise((resolve, reject) => {
    res.render('commonList/list.ejs', {
      pageCode: pageCode || '',
      dataSource: dataSource
    }, (err, html) => {
      if (err) {
        console.error('Error rendering commonList/list.ejs:', err);
        reject(err);
      } else {
        resolve(html);
      }
    });
  });
  
  // 写入 list.vue 文件
  const listVuePath = path.join(targetDir, 'list.vue');
  await fs.writeFile(listVuePath, listVueContent);
  
  // 处理 hooks 目录
  const hooksSourceDir = path.join(templateDir, 'hooks');
  const hooksDestDir = path.join(targetDir, 'hooks');
  await fs.mkdir(hooksDestDir, { recursive: true });
  
  if (await fileExists(hooksSourceDir)) {
    const hookFiles = await fs.readdir(hooksSourceDir);
    for (const file of hookFiles) {
      const sourcePath = path.join(hooksSourceDir, file);
      const destPath = path.join(hooksDestDir, file);
      const stat = await fs.stat(sourcePath);
      
      if (stat.isFile()) {
        // 处理 .ejs 文件
        if (file.endsWith('.ejs')) {
          // 根据不同的 hooks 文件传递不同的数据
          let renderData = {
            pageCode: pageCode || ''
          };
          
          // 对于 useForms.ejs，传递 queryFields
          if (file === 'useForms.ejs' && dataSource) {
            renderData.queryFields = dataSource.queryFields || [];
          }
          
          // 对于 useTables.ejs，传递 listFields
          if (file === 'useTables.ejs' && dataSource) {
            renderData.listFields = dataSource.listFields || [];
          }
          
          let content = await new Promise((resolve, reject) => {
            res.render(`commonList/hooks/${file}`, renderData, (err, html) => {
              if (err) {
                console.error(`Error rendering commonList/hooks/${file}:`, err);
                reject(err);
              } else {
                resolve(html);
              }
            });
          });
          
          // 将 .ejs 文件保存为 .ts 文件
          const destTsPath = destPath.replace(/\.ejs$/, '.tsx');
          await fs.writeFile(destTsPath, content);
        } else {
          // 直接复制非 ejs 文件
          await fs.copyFile(sourcePath, destPath);
        }
      }
    }
  }
}

module.exports = {
  processMultiTabDetailTemplate
};